#include <iostream>

using namespace std;

typedef struct _LINK_NODE
{
	/* data */
	int data;
	struct _lINK_NODE* next;
}_LINK_NODE;

LINK_NODE* alloca_node(int value)
{
	LINK_NODE* pLinkNode = NULL;
	pLinkNode = (LINK_NODE*)malloc(sizeof(LINK_NODE));

	pLinkNode->data = value;
	pLinkNode->next = NULL;
	return pLinkNode;
}

void delete_node(LINK_NODE** pNode)
{
	LINK_NODE** pNext;
	if(pNode == NULL || *pNode == NULL)
		return;
	pNext = &((*pNode)->next);
	free((*pNode));
	delete_node(pNext);
}

STATUS _add_data(LINK_NODE** pNode, LINK_NODE* pDataNode)
{
	if(*pNode == NULL){
		*pNode = pDataNode;
		return TRUE;
	}
	return _add_data(&(*pNode)->next, pDataNode);
}

STATUS add_data(const LINK_NODE** pNode, int value)
{
	LINK_NODE* pDataNode;
	if(*pNode == NULL)
		return FALSE;

	pDataNode = alloca_node(value);
	return _add_data((LINK_NODE**)pNode, pDataNode);
}

STATUS _delete_data(LINK_NODE** pNode, int value)
{
	LINK_NODE* pLinkNode;
	if((*pNode)->next == NULL)
		return FALSE;
	pLinkNode = (*pNode)->next;
	if(pLinkNode->data == value){
		(*pNode)->next = pLinkNode->next;
		free(pLinkNode);
		return TRUE;
	}else{
		return _delete_data(&(*pNode)->next, value);
	}
}

STATUS delete_data(LINK_NODE** pNode, int value)
{
	LINK_NODE* pLinkNode;
	if(pNode == NULL || *pNode == NULL)
		return FALSE;

	if((*pNode)->data == value){
		pLinkNode = *pNode;
		*pNode = pLinkNode->next;
		free(pLinkNode);
		return TRUE;
	}
	return _delete_data(pNode, value);
}

LINK_NODE* find_data(const LINK_NODE* pLinkNode, int value)
{
	if(pLinkNode == NULL)
		return NULL;

	if(value == pLinkNode->data)
		return (LINK_NODE*)pLinkNode;

	return find_data(pLinkNode->next, value); 
}

void print_node(const LINK_NODE* pLinkNode)
{
	if(pLinkNode){
		printf("%d\n", pLinkNode->data);
		print_node(pLinkNode->next);
	}
}

int count_node(const LINK_NODE* pLinkNode)  
{  
    if(NULL == pLinkNode)  
        return 0;  
          
    return 1 + count_node(pLinkNode->next);  
}  

int main()
{
    cout << "Hello world!" << endl;
    return 0;
}
